support qy login

FFIB 5 jaren geleden
bovenliggende
commit
11df57b63d
5 gewijzigde bestanden met toevoegingen van 186 en 9 verwijderingen
  1. 44 2
      account/models.py
  2. 7 1
      mch/admin.py
  3. 56 0
      mch/migrations/0057_auto_20200602_1403.py
  4. 33 2
      mch/models.py
  5. 46 4
      miniapp/qy_views.py

+ 44 - 2
account/models.py

@@ -7,7 +7,7 @@ from jsonfield import JSONField
7 7
 from TimeConvert import TimeConvert as tc
8 8
 
9 9
 from kodo.basemodels import LensmanTypeBoolMixin
10
-from mch.models import SaleclerkInfo
10
+from mch.models import SaleclerkInfo, MaintenancemanInfo
11 11
 from sales.models import SalesResponsibilityInfo
12 12
 
13 13
 
@@ -451,6 +451,47 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
451 451
             saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {}
452 452
         else:
453 453
             saleclerk_info = {}
454
+
455
+        return {
456
+            'has_unionid': bool(self.unionid),
457
+            'user_id': self.user_id,
458
+            'name': self.name,
459
+            'username': self.username,
460
+            'nickname': self.nickname,
461
+            'avatar': self.avatar,
462
+            'phone': self.phone,
463
+            'subscribe': self.subscribe,
464
+            're_membercard': True if self.has_membercard and not self.memberusercardcode else False,
465
+            'has_membercard': self.has_membercard,
466
+            'membercardid': self.membercardid,
467
+            'memberusercardcode': self.memberusercardcode,
468
+            'cardList': self.cardList,
469
+            'saleclerk': bool(saleclerk_info),
470
+            'saleclerk_info': saleclerk_info,
471
+            'sr_info': self.srinfo(brand_id),
472
+            # 会员信息
473
+            'integral': self.integral,
474
+            'freeze_integral': self.freeze_integral,
475
+            'shots_num': self.shots_num,
476
+            'level': self.level,
477
+        }
478
+    
479
+    def brand_qydata(self, brand_id=None):
480
+        if self.phone:
481
+            try:
482
+                saleclerk = SaleclerkInfo.objects.get(brand_id=brand_id, clerk_phone=self.phone, status=True)
483
+            except SaleclerkInfo.DoesNotExist:
484
+                saleclerk = None
485
+            saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {}
486
+        else:
487
+            saleclerk_info = {}
488
+        
489
+        try:
490
+            maintenance = MaintenancemanInfo.objects.get(brand_id=brand_id, user_id=self.user_id, status=True)
491
+        except SaleclerkInfo.DoesNotExist:
492
+            maintenance = {}
493
+        
494
+        maintenance_info = maintenance.data if maintenance else {}
454 495
         return {
455 496
             'has_unionid': bool(self.unionid),
456 497
             'user_id': self.user_id,
@@ -474,7 +515,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
474 515
             'shots_num': self.shots_num,
475 516
             'level': self.level,
476 517
             # 维修员信息
477
-            'is_maintenance': self.is_maintenance,
518
+            'is_maintenance': bool(maintenance_info),
519
+            'maintenance': maintenance_info,
478 520
         }
479 521
 
480 522
     @property

+ 7 - 1
mch/admin.py

@@ -10,7 +10,7 @@ from pysnippets.strsnippets import strip
10 10
 
11 11
 from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, CameraModelInfo, ConsumeInfoSubmitLogInfo,
12 12
                         DistributorInfo, LatestAppInfo, LatestAppScreenInfo, ModelCameraBodyInfo, ModelInfo,
13
-                        OperatorInfo, SaleclerkInfo)
13
+                        OperatorInfo, SaleclerkInfo, MaintenancemanInfo)
14 14
 from utils.redis.rshot import update_member_shot_data
15 15
 
16 16
 
@@ -161,6 +161,11 @@ class SaleclerkInfoAdmin(AdvancedExportExcelModelAdmin, AdvancedActionsModelAdmi
161 161
     search_fields = ('brand_id', 'brand_name', 'distributor_id', 'distributor_name', 'clerk_id', 'clerk_name', 'clerk_phone', 'unionid', 'openid')
162 162
     actions_exclude = ('delete_selected', )
163 163
 
164
+class MaintenancemanInfoAdmin(AdvancedExportExcelModelAdmin, AdvancedActionsModelAdmin, admin.ModelAdmin):
165
+    list_display = ('brand_name', 'wx_userid', 'maintenance_id', 'maintenance_name', 'maintenance_phone', 'status', 'created_at', 'updated_at')
166
+    search_fields = ('maintenance_id', 'maintenance_name', 'maintenance_phone')
167
+    actions_exclude = ('delete_selected', )
168
+
164 169
 
165 170
 class BrandModelDistributorPriceInfoAdmin(admin.ModelAdmin):
166 171
     list_display = ('brand_id', 'brand_name', 'model_id', 'model_name', 'distributor_id', 'distributor_name', 'factory_yuan', 'integral', 'status', 'created_at', 'updated_at')
@@ -247,3 +252,4 @@ admin.site.register(LatestAppInfo, LatestAppInfoAdmin)
247 252
 admin.site.register(LatestAppScreenInfo, LatestAppScreenInfoAdmin)
248 253
 admin.site.register(ConsumeInfoSubmitLogInfo, ConsumeInfoSubmitLogInfoAdmin)
249 254
 admin.site.register(ActivityInfo, ActivityInfoAdmin)
255
+admin.site.register(MaintenancemanInfo, MaintenancemanInfoAdmin)

+ 56 - 0
mch/migrations/0057_auto_20200602_1403.py

@@ -0,0 +1,56 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.26 on 2020-06-02 06:03
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+import shortuuidfield.fields
7
+
8
+
9
+class Migration(migrations.Migration):
10
+
11
+    dependencies = [
12
+        ('mch', '0056_auto_20200601_1640'),
13
+    ]
14
+
15
+    operations = [
16
+        migrations.CreateModel(
17
+            name='MaintenancemanInfo',
18
+            fields=[
19
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20
+                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
21
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
22
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
23
+                ('sex', models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], db_index=True, default=0, help_text='Sex', verbose_name='sex')),
24
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')),
25
+                ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name')),
26
+                ('user_id', models.CharField(blank=True, db_index=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, unique=True, verbose_name='user_id')),
27
+                ('wx_userid', models.CharField(blank=True, db_index=True, help_text='\u4f01\u4e1a\u5fae\u4fe1 user_id', max_length=32, null=True, verbose_name='wx_userid')),
28
+                ('maintenance_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u7ef4\u4fee\u5458\u552f\u4e00\u6807\u8bc6', max_length=22, unique=True)),
29
+                ('maintenance_name', models.CharField(blank=True, help_text='\u7ef4\u4fee\u5458\u540d\u79f0', max_length=32, null=True, verbose_name='maintenance_name')),
30
+                ('maintenance_sex', models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], db_index=True, default=1, help_text='\u7ef4\u4fee\u5458\u6027\u522b', verbose_name='maintenance_sex')),
31
+                ('maintenance_phone', models.CharField(blank=True, help_text='\u7ef4\u4fee\u5458\u8054\u7cfb\u7535\u8bdd', max_length=11, null=True, unique=True, verbose_name='maintenance_phone')),
32
+            ],
33
+            options={
34
+                'verbose_name': '\u7ef4\u4fee\u5458\u4fe1\u606f',
35
+                'verbose_name_plural': '\u7ef4\u4fee\u5458\u4fe1\u606f\u4fe1\u606f',
36
+            },
37
+        ),
38
+        migrations.AddField(
39
+            model_name='saleclerkinfo',
40
+            name='user_id',
41
+            field=models.CharField(blank=True, db_index=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='user_id'),
42
+        ),
43
+        migrations.AlterField(
44
+            model_name='saleclerkinfo',
45
+            name='clerk_phone',
46
+            field=models.CharField(blank=True, help_text='\u5e97\u5458\u8054\u7cfb\u7535\u8bdd', max_length=11, null=True, unique=True, verbose_name='clerk_phone'),
47
+        ),
48
+        migrations.AlterUniqueTogether(
49
+            name='saleclerkinfo',
50
+            unique_together=set([('clerk_phone', 'brand_id')]),
51
+        ),
52
+        migrations.AlterUniqueTogether(
53
+            name='maintenancemaninfo',
54
+            unique_together=set([('maintenance_phone', 'brand_id')]),
55
+        ),
56
+    ]

+ 33 - 2
mch/models.py

@@ -426,8 +426,9 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin):
426 426
     clerk_id = ShortUUIDField(_(u'clerk_id'), max_length=32, help_text=u'店员唯一标识', db_index=True, unique=True)
427 427
     clerk_name = models.CharField(_(u'clerk_name'), max_length=32, blank=True, null=True, help_text=u'店员名称')
428 428
     clerk_sex = models.IntegerField(_(u'clerk_sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.MALE, help_text=u'店员性别', db_index=True)
429
-    clerk_phone = models.CharField(_(u'clerk_phone'), max_length=11, blank=True, null=True, help_text=u'店员联系电话')
429
+    clerk_phone = models.CharField(_(u'clerk_phone'), max_length=11, blank=True, null=True, help_text=u'店员联系电话', unique=True)
430 430
 
431
+    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
431 432
     unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 UnionID', db_index=True)
432 433
     openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 OpenID', db_index=True)
433 434
     wx_userid = models.CharField(_(u'wx_userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 user_id', db_index=True)
@@ -451,7 +452,7 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin):
451 452
         verbose_name_plural = _(u'经销商销售员信息')
452 453
 
453 454
         unique_together = (
454
-            ('unionid', 'brand_id'),
455
+            ('clerk_phone', 'brand_id'),
455 456
         )
456 457
 
457 458
     def __unicode__(self):
@@ -477,6 +478,36 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin):
477 478
 
478 479
     data = admindata
479 480
 
481
+class MaintenancemanInfo(BaseModelMixin, SexModelMixin):
482
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
483
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
484
+
485
+    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True, unique=True)
486
+    wx_userid = models.CharField(_(u'wx_userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 user_id', db_index=True)
487
+
488
+    maintenance_id = ShortUUIDField(_(u'maintenance_id'), max_length=32, help_text=u'维修员唯一标识', db_index=True, unique=True)
489
+    maintenance_name = models.CharField(_(u'maintenance_name'), max_length=32, blank=True, null=True, help_text=u'维修员名称')
490
+    maintenance_sex = models.IntegerField(_(u'maintenance_sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.MALE, help_text=u'维修员性别', db_index=True)
491
+    maintenance_phone = models.CharField(_(u'maintenance_phone'), max_length=11, blank=True, null=True, help_text=u'维修员联系电话', unique=True)
492
+
493
+    class Meta:
494
+        verbose_name = _(u'维修员信息')
495
+        verbose_name_plural = _(u'维修员信息信息')
496
+
497
+        unique_together = (
498
+            ('maintenance_phone', 'brand_id'),
499
+        )
500
+
501
+    def __unicode__(self):
502
+        return unicode(self.pk)
503
+
504
+    @property
505
+    def data(self):
506
+        return  {
507
+            'maintenance_id': self.maintenance_id,
508
+            'maintenance_name': self.maintenance_name,
509
+            'maintenance_phone': self.maintenance_phone,
510
+        }
480 511
 
481 512
 class BrandModelDistributorPriceInfo(BaseModelMixin):
482 513
     brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)

+ 46 - 4
miniapp/qy_views.py

@@ -1,6 +1,8 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 import logging
4
+import requests
5
+import json
4 6
 
5 7
 from django.conf import settings
6 8
 from django.db import transaction
@@ -9,16 +11,17 @@ from django_logit import logit
9 11
 from django_response import response
10 12
 from ipaddr import client_ip
11 13
 from pyqywe_miniapp import get_userid
14
+from pyqywe_token import access_token
12 15
 from pywe_storage import RedisStorage
13 16
 from TimeConvert import TimeConvert as tc
14 17
 
15 18
 from account.models import UserInfo
19
+from mch.models import SaleclerkInfo, DistributorInfo, MaintenancemanInfo
16 20
 from statistic.models import RegisterStatisticInfo
17
-from utils.error.errno_utils import ProductBrandStatusCode
21
+from utils.error.errno_utils import ProductBrandStatusCode, ProductDistributorStatusCode
18 22
 from utils.redis.connect import r
19 23
 from utils.redis.rprofile import set_profile_info
20 24
 
21
-
22 25
 WECHAT = settings.WECHAT
23 26
 logger = logging.getLogger('logit')
24 27
 
@@ -41,6 +44,13 @@ def qy_login_api(request):
41 44
 
42 45
     userid = get_userid(appid=appid, secret=secret, code=code, storage=RedisStorage(r))
43 46
 
47
+    token = access_token(appid=appid, secret=secret, storage=RedisStorage(r))
48
+
49
+    userinfo = requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token='+token+'&userid='+userid).text
50
+    userinfo = json.loads(userinfo)
51
+
52
+    mobile = userinfo.get('mobile', '')
53
+    
44 54
     # Get or Create User
45 55
     user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid)
46 56
 
@@ -61,10 +71,42 @@ def qy_login_api(request):
61 71
     user.user_status = UserInfo.ACTIVATED
62 72
     user.signup_ip = client_ip(request)
63 73
     user.signup_at = tc.utc_datetime()
64
-    user.is_maintenance = userid in settings.QY_MAINTENANCE_USERID
74
+    user.phone = mobile
65 75
     user.save()
66 76
 
67 77
     # Store Userinfo
68 78
     set_profile_info(user)
69 79
 
70
-    return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id))
80
+    # 维修员登录 (122 维修部部门ID)
81
+    if 122 in userinfo.get('department', []):
82
+        maintenance, created = MaintenancemanInfo.objects.get_or_create(brand_id=brand_id, maintenance_phone=mobile, status=True)
83
+        
84
+        if created:
85
+            maintenance.maintenance_name = userinfo.get('name', '')
86
+            maintenance.maintenance_sex = userinfo.get('gender', 0)
87
+            maintenance.maintenance_phone = mobile
88
+            maintenance.user_id = user.user_id
89
+            maintenance.save()        
90
+    else:
91
+        # 销售员登录
92
+        saleclerk, created = SaleclerkInfo.objects.get_or_create(brand_id=brand_id, clerk_phone=mobile, status=True)
93
+
94
+        if created:
95
+            try:
96
+                distributor = DistributorInfo.objects.get(department_id__in=userinfo.get('department', []))
97
+            except:
98
+                return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)
99
+            
100
+            saleclerk.brand_id = brand_id
101
+            saleclerk.distributor_id = distributor.distributor_id
102
+            saleclerk.distributor_name = distributor.distributor_name
103
+            saleclerk.clerk_name = userinfo.get('name', '')
104
+            saleclerk.sex = userinfo.get('gender', 0)
105
+            saleclerk.clerk_phone = userinfo.get('mobile', '')
106
+            saleclerk.user_id = user.user_id
107
+            saleclerk.wx_userid = userid
108
+            saleclerk.user_status = SaleclerkInfo.ACTIVATED
109
+            saleclerk.is_auth = True
110
+            saleclerk.save()
111
+
112
+    return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brand_qydata(brand_id=brand_id))